package cn.com.scooper.config;

import cn.com.scooper.utils.MineCityRequestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

/**
 * Spring容器初始化完成监听器，该监听器将在所有的Bean都初始化完成之后被调用。
 * <p>
 *     该类主要是在所有Bean都初始化之后处理一些的操作，比如前置检查、数据加载、初始化缓存等。
 *     建议尽量在相关的@Service、@Component中使用@PostConstruct来处理这些操作，已减少程序的耦合性。
 * </p>
 * <p>
 *     在web 项目中（spring mvc），系统会存在两个容器，一个是root application context ,
 *     另一个就是我们自己的 projectName-servlet context（作为root application context的子容器），
 *     这种情况下，就会造成onApplicationEvent方法被执行两次。
 *     为了避免上面提到的问题，我们可以只在root application context初始化完成后调用逻辑代码，
 *     其他的容器的初始化完成，则不做任何处理。
 * </p>
 *
 * @author LuLihong
 * @date 2019-11-23
 **/
@Component
public class ApplicationInitializedListener implements ApplicationListener<ContextRefreshedEvent> {
    private static final Logger LOG = LoggerFactory.getLogger(ApplicationInitializedListener.class);

    @Autowired
    private MineCityRequestUtils mineCityRequestUtils;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if(event.getApplicationContext().getParent() == null) {
            LOG.info("Spring容器初始化完成");
            mineCityRequestUtils.getJwtToken();
        }
    }
}
